package thread;

/**
 * 互斥性
 * 当使用多个synchronized锁定多个不同的代码片段，并且指定的同步监视器对象为同一个
 * 时，这些代码片段之间是互斥的，即:多个线程不能同时在这些方法中调用
 */
public class SyncDemo4 {
    public static void main(String[] args) {
        Boo boo = new Boo();
//        Thread t1 = new Thread(()-> boo.methodA());
//        Thread t2 = new Thread(()-> boo.methodB());
        /*
            lambda表达式的特殊写法:方法引用
            使用条件:
            1:lambda表达式中只有一句代码
            2:lambda表达式中参数列表和被调用方法的参数列表一致
            语法:
            类名::方法名   适用于静态方法
            对象::方法名   适用于成员方法

            例如:
            () -> boo.methodB()
             ^------一致------^
             简写为:boo::methodB
         */
        Thread t1 = new Thread(boo::methodA);
        Thread t2 = new Thread(boo::methodB);

        t1.start();
        t2.start();
    }
}

class Boo{
    public synchronized void methodA(){
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+":正在执行A方法");
            Thread.sleep(5000);
            System.out.println(t.getName()+":A方法执行完毕");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    public synchronized void methodB(){
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+":正在执行B方法");
            Thread.sleep(5000);
            System.out.println(t.getName()+":B方法执行完毕");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}